% !TEX program = xelatex
% 使用 ctexbeamer 文档类，它会自动处理中文支持和字体
\documentclass[aspectratio=169]{ctexbeamer}

% --- 主题与配色 ---
\usetheme{Madrid} % 或其他主题如 Warsaw, Boadilla, AnnArbor 等
\usecolortheme{default} % 或 beaver, dolphin, orchid 等

% --- 包的引用 ---
% ctexbeamer 已包含 xeCJK 和 fontspec 的基本功能，通常无需重复加载
% \usepackage{xeCJK}
% \usepackage{fontspec}
\usepackage{graphicx} % 插入图片
\usepackage{booktabs} % 表格线
\usepackage{amsmath} % 数学公式
\usepackage{amssymb} % 数学符号
\usepackage{listings} % 代码块 (如果需要展示代码)
\usepackage{tikz} % Mermaid 图可能需要手动转成 TikZ 或作为图片插入
\usetikzlibrary{shapes, arrows, positioning, calc} % TikZ 常用库
%\usepackage{mwe} % 如果需要示例图片，可以取消注释

% --- 中文字体设置 --- 
% 使用 ctexbeamer 后，通常不需要手动设置字体
% 如果默认字体不满意，可以稍后尝试添加 \setCJKmainfont 等命令
% % \setCJKmainfont{Noto Sans CJK SC}
% % \setCJKsansfont{Noto Sans CJK SC}
% % \setCJKmonofont{Noto Sans Mono CJK SC}

% --- Listings 代码块设置 (可选) ---
\lstset{
    language=Python, % 默认语言
    basicstyle=\scriptsize\ttfamily, % 调整字号以容纳更多代码
    keywordstyle=\color{blue},
    commentstyle=\color{gray}\itshape, % 注释改为斜体
    stringstyle=\color{purple}, % 字符串换颜色
    showstringspaces=false,
    breaklines=true,
    frame=tb, % 上下边框
    numbers=left,
    numberstyle=\tiny\color{gray},
    tabsize=2, % 调整 tab 宽度
    captionpos=b % 标题放在下方
}

% --- PPT 信息 ---
\title{基于可穿戴设备数据的健康行为分析与挖掘}
\subtitle{泰迪杯大数据挖掘竞赛 B 题解决方案}
\author{牛马团队 / 郭沛然} % TODO: 修改为您的团队信息
\institute{武汉纺织大学} % TODO: 修改为您的机构信息
\date{\today}

% --- Logo (可选) ---
\logo{\includegraphics[height=1cm]{picture/school.png}} % TODO: 取消注释并提供 logo 文件

% --- Beamer 设置 ---
\beamertemplatenavigationsymbolsempty % 隐藏导航按钮
\setbeamertemplate{caption}[numbered] % 图表标题编号

\begin{document}

% --- 封面页 ---
{
    \setbeamertemplate{footline}{} % 隐藏封面页脚
    \frame{\titlepage}
}

% --- 目录页 (可选) ---
\begin{frame}{目录}
    \tableofcontents
\end{frame}

% ==============================
% 1. 背景与目标
% ==============================
\section{背景与目标}

\begin{frame}{研究背景：可穿戴设备与健康大数据时代}
    \begin{itemize}
        \item 智能手环/手表普及，健康数据海量增长。
        \item 加速度计：低成本、低功耗，提供客观行为数据。
        \item 应用机遇：精准医疗、个性化健康管理、临床研究。
    \end{itemize}
    \vfill % 垂直填充以便图片放置
    \begin{figure}
        \centering
        % TODO: 建议替换为更具体的图片
        \fbox{\includegraphics[width=0.4\textwidth]{picture/watch.png}} % 使用带边框的占位符，提示替换
        \caption{华为手表}
    \end{figure}
\end{frame}

\begin{frame}{面临挑战与竞赛目标}
    \framesubtitle{挑战}
    \begin{itemize}
        \item 海量连续数据分析效率。
        \item 个体活动模式差异性。
        \item 特定行为识别的复杂性。
    \end{itemize}
    \pause % 动画效果
    \framesubtitle{竞赛目标 (四大任务)}
    \begin{enumerate}
        \item \textbf{活动统计}: 分析志愿者活动组成。
        \item \textbf{MET 估计}: 构建模型预测活动强度。
        \item \textbf{睡眠识别}: 智能识别睡眠模式。
        \item \textbf{久坐预警}: 检测并预警久坐行为。
    \end{enumerate}
\end{frame}

% ==============================
% 2. 整体技术方案
% ==============================
\section{整体技术方案}


\begin{frame}{高效并行处理框架}
    \begin{itemize}
        \item \textbf{动机}: 处理百名志愿者数据，串行耗时过长。
        \item \textbf{方案}: 基于 Python \texttt{multiprocessing.Pool}。
        \item \textbf{核心}: \texttt{imap\_unordered} 实现任务分发与动态负载均衡。
        \item \textbf{优势}:
        \begin{itemize}
            \item \alert{效率提升}: 充分利用64核 CPU，显著缩短处理时间 (约 8 倍)。 % TODO: 填入实际加速比
            \item \alert{内存优化}: 每个进程处理独立文件，降低单进程内存峰值。
            \item \alert{适用性广}: 任务一至四的数据处理和预测阶段均采用。
        \end{itemize}
    \end{itemize}
    \vfill
    \begin{figure}
        \centering
        % TODO: 建议替换为更具体的图片
        \fbox{\includegraphics[width=0.4\textwidth]{picture/cpu.png}}
        \caption{利用多核 CPU 进行并行处理}
    \end{figure}
\end{frame}

% ==============================
% 3. 任务一：活动统计分析
% ==============================
\section{任务一：活动统计分析}

\begin{frame}{目标与方法}
    \frametitle{任务一：志愿者活动统计分析}
    \begin{columns}[T]
        \begin{column}{0.5\textwidth}
            \textbf{目标}:
            \begin{itemize}
                \item 统计每位志愿者总记录时长 (小时)。
                \item 统计五类活动时长 (分钟): 睡眠、静态、低/中/高强度。
            \end{itemize}
            \medskip % 增加一点垂直间距
            \textbf{方法}:
            \begin{itemize}
                \item \textbf{并行处理}: \texttt{analyze\_volunteer\_data} 处理单人。
                \item \textbf{时长计算}: 相邻时间戳差值 (\texttt{diff()})。
                \item \textbf{活动分类}: 基于标注 MET 值。
            \end{itemize}
        \end{column}
        \begin{column}{0.5\textwidth}
            \textbf{流程图}:
            \begin{figure}
                % TODO: 建议将 Mermaid 流程图导出为图片替换下方占位符
                \fbox{\includegraphics[width=0.8\textwidth]{picture/task1.png}}
                \caption{任务一处理流程 }
            \end{figure}
        \end{column}
    \end{columns}
\end{frame}

% --- 新增：任务一核心代码示例 ---
\begin{frame}[fragile] % fragile 选项允许 verbatim 环境
    \frametitle{任务一：核心代码逻辑}
    \textbf{并行处理设置 (task1\_activity\_analysis\_parallel\_Finally.py)}
    \begin{lstlisting}[caption={使用 multiprocessing.Pool 进行并行分析}]
# 确定进程数
if num_processes is None:
    num_processes = mp.cpu_count()

results = []
# 创建进程池
with mp.Pool(processes=num_processes) as pool:
    # 使用imap_unordered和tqdm显示进度
    with tqdm(total=len(files), desc="并行处理志愿者数据") as pbar:
        for result in pool.imap_unordered(analyze_volunteer_data, files):
            results.append(result)
            pbar.update(1) # 每完成一个任务，进度条更新一次
# 将结果转换为DataFrame
result_df = pd.DataFrame(results)
    \end{lstlisting}
\end{frame}

\begin{frame}[fragile] % fragile 选项允许 verbatim 环境
    \frametitle{任务一：核心代码逻辑}
    \textbf{时长计算 (analyze\_volunteer\_data 函数内部)}
    \begin{lstlisting}[caption={基于时间差计算时长}]
# 处理时间戳...
df = df.sort_values('datetime')
df['time_diff'] = df['datetime'].diff().dt.total_seconds()
# 处理首行 NaN 和异常值...
median_interval = df['time_diff'].median()
df.loc[df.index[0], 'time_diff'] = median_interval
# ...填充过大间隔和负值...
# 计算总时长
total_time_sec = df['time_diff'].sum()
# 分类活动并累加时长
activity_minutes = {}
for activity_type in ['sleep', 'static', 'low', 'moderate', 'high']:
    activity_time = df[df['activity_type'] == activity_type]['time_diff'].sum() / 60
    activity_minutes[activity_type] = activity_time
    \end{lstlisting}
\end{frame}



\begin{frame}{结果展示}
    \frametitle{任务一：结果概览}
    \begin{columns}[T]
        \begin{column}{0.4\textwidth}
            \textbf{汇总表 (\texttt{result\_1\_parallel.xlsx})}
            \tiny % 使用更小的字号
            \begin{tabular}{lrrrr}
                \toprule
                志愿者ID & 总时长(h) & 睡眠(m) & 高强度(m) & 中强度(m) & 低强度(m) & 静态活动总时长(m) \\
                \midrule
                P001 & 26.4506 & 1587.0340 & 0 & 0 & 0 & 0 \\ % 示例数据
                P002 & 18.8491 & 1130.9453 & 0 & 0 & 0 & 0 \\
                P003 & 21.6372 & 1298.2340 & 0 & 0 & 0 & 0 \\
                \bottomrule
            \end{tabular}
            \normalsize % 恢复正常字号
            \bigskip
            *数值保留小数点后 4 位。
            \medskip
            % 可选：添加总时长直方图
            \begin{figure}
                \includegraphics[width=0.7\textwidth]{picture/1/total_duration_histogram.png}
                \caption{总记录时长分布}
            \end{figure}
        \end{column}
        \begin{column}{0.6\textwidth}
            \textbf{可视化图表}
            \begin{figure}
                \includegraphics[width=0.8\textwidth]{picture/1/activity_distribution_stacked_bar.png}
                \caption{各志愿者活动时长分布}
            \end{figure}
            \begin{figure}
                \includegraphics[width=0.8\textwidth]{picture/1/average_activity_pie_chart.png}
                \caption{平均活动时长占比}
            \end{figure}
            % 可选：添加箱线图
            % \begin{figure}
            %     \includegraphics[width=\textwidth]{picture/1/activity_duration_boxplots.png}
            %     \caption{各活动类型时长箱线图}
            % \end{figure}
        \end{column}
    \end{columns}
\end{frame}

% ==============================
% 4. 任务二：MET 值估计模型
% ==============================
\section{任务二：MET 值估计模型}

\begin{frame}{目标与方法}
    \frametitle{任务二：构建身体活动 MET 值估计模型}
    \textbf{目标}: 利用加速度和人口统计学数据预测 MET 值。
    \medskip
    \textbf{方法}:
    \begin{itemize}
        \item \textbf{框架}: 滑动窗口 (6s 窗口, 3s 步长) + 特征工程 + \alert{LightGBM} 回归。
        \item \textbf{优化}: \alert{RandomizedSearchCV} + 5 折交叉验证进行超参数调优。
        \item \textbf{处理}: \alert{Pipeline} 整合预处理 (标准化/独热编码) 与模型。
    \end{itemize}
    % 可选：添加模型框架示意图
\end{frame}

% --- 新增：任务二核心代码示例 ---
\begin{frame}[fragile]
    \frametitle{任务二：核心代码逻辑}
    \textbf{特征提取 (extract\_window\_features 函数部分)}
    \begin{lstlisting}[caption={提取时域、频域、相关性及静态特征}]
def extract_window_features(window_data, age, sex):
    features = {}
    # 基本统计特征 (循环处理 x, y, z, magnitude)
    for col in ['x', 'y', 'z', 'magnitude']:
        series = window_data[col].dropna()
        features[f'{col}_mean'] = series.mean()
        features[f'{col}_std'] = series.std(ddof=0)
        # ... (var, min, max, median, iqr, skew, kurt, rms)
    # 信号幅值面积 (SMA)
    features['sma'] = window_data[['x','y','z']].abs().sum().sum() / len(window_data)
    # 轴间相关性
    features['corr_xy'] = window_data['x'].corr(window_data['y']) #... (xz, yz)
    # 频率域特征 (FFT)
    n_samples = len(window_data)
    if n_samples > 1:
        # ... (计算 fft_vals, fft_power)
        for col in ['x', 'y', 'z', 'magnitude']:
            # ... (提取 fft_power_i, fft_energy, fft_entropy)
    # 添加静态特征
    features['age'] = age
    features['sex'] = sex
    # ... (处理 NaN)
    return features
    \end{lstlisting}
    \vspace{0.5em}
    \textbf{模型与调优设置 (main 函数部分)}
    \begin{lstlisting}[caption={Pipeline 与 RandomizedSearchCV}]
# 定义预处理器 (ColumnTransformer) 和模型 (LGBMRegressor)
preprocessor = ColumnTransformer(...)
lgbm = lgb.LGBMRegressor(random_state=42, n_jobs=1)
pipeline = Pipeline(steps=[('preprocessor', preprocessor), ('regressor', lgbm)])

# 超参数搜索空间
param_dist = { 'regressor__n_estimators': sp_randint(100, 800), ... }

# RandomizedSearchCV 设置
cv_strategy = KFold(n_splits=CV_FOLDS, shuffle=True, random_state=42)
random_search = RandomizedSearchCV(pipeline, param_distributions=param_dist,
                                 n_iter=N_ITER_SEARCH, cv=cv_strategy,
                                 scoring='neg_mean_squared_error', ...)
random_search.fit(X_train, y_train)
best_model = random_search.best_estimator_
    \end{lstlisting}
\end{frame}

\begin{frame}{特征工程：捕捉活动状态信息}
    \begin{columns}[T]
        \begin{column}{0.5\textwidth}
            \textbf{时域特征}:
            \begin{itemize}
                \item 均值, 标准差, 方差, ...
                \item 偏度, 峰度, RMS
                \item SMA (信号幅值面积)
            \end{itemize}
            \medskip
            \textbf{频域特征} (FFT):
            \begin{itemize}
                \item 功率谱主要分量
                \item 总能量, 频谱熵
            \end{itemize}
        \end{column}
        \begin{column}{0.5\textwidth}
            \textbf{相关性特征}:
            \begin{itemize}
                \item 轴间相关系数 (X-Y, X-Z, Y-Z)
            \end{itemize}
            \medskip
            \textbf{静态特征}:
            \begin{itemize}
                \item 年龄 (标准化)
                \item 性别 (独热编码)
            \end{itemize}
            \medskip
            \begin{figure}
                \centering
                 % TODO: 建议替换为更具体的图片
                \fbox{\includegraphics[width=0.8\textwidth]{picture/placeholder_sw.png}}
                \caption{滑动窗口特征提取 (请替换为实际示意图)}
            \end{figure}
        \end{column}
    \end{columns}
\end{frame}

\begin{frame}{模型性能评估}
    \begin{columns}[T]
        \begin{column}{0.5\textwidth}
            \textbf{评估指标 (训练集)}:
            \begin{itemize}
                \item MAE: [数值] % TODO: 填入实际数值
                \item RMSE: [数值] % TODO: 填入实际数值
                \item R²: [数值] % TODO: 填入实际数值
            \end{itemize}
            \medskip
            \textbf{超参数调优}:
            \begin{figure}
                 \includegraphics[width=0.9\textwidth]{picture/2/cv_score_distribution.png}
                 \caption{交叉验证得分分布}
            \end{figure}
            % 可选：添加 vs hyperparams 图
            % \begin{figure}
            %      \includegraphics[width=0.9\textwidth]{picture/2/cv_score_vs_hyperparams.png}
            %      \caption{得分 vs 超参数}
            % \end{figure}
        \end{column}
        \begin{column}{0.5\textwidth}
            \textbf{特征重要性}:
            \begin{figure}
                 \includegraphics[width=\textwidth]{picture/2/feature_importance.png}
                 \caption{LightGBM 特征重要性排序}
            \end{figure}
            *解读: 例如 acc\_z\_std, magnitude\_mean 等特征贡献最大。
        \end{column}
    \end{columns}
\end{frame}

\begin{frame}{模型性能评估 (续)}
    \frametitle{训练集预测效果}
    \begin{columns}[T]
        \begin{column}{0.5\textwidth}
            \textbf{预测值 vs 真实值}
            \begin{figure}
                 \includegraphics[width=\textwidth]{picture/2/prediction_vs_actual_train.png}
                 \caption{训练集预测 vs 真实 MET}
            \end{figure}
        \end{column}
        \begin{column}{0.5\textwidth}
            \textbf{残差分布}
            \begin{figure}
                 \includegraphics[width=\textwidth]{picture/2/residuals_vs_predicted_train.png}
                 \caption{残差 vs 预测值}
            \end{figure}
            \medskip
            \textbf{误差分布}
            \begin{figure}
                 \includegraphics[width=\textwidth]{picture/2/error_distribution_train.png}
                 \caption{预测误差分布}
            \end{figure}
        \end{column}
    \end{columns}
\end{frame}


\begin{frame}{附件二 MET 预测与活动分析}
    \begin{columns}[T]
        \begin{column}{0.5\textwidth}
            \textbf{测试集预测 MET 分布}
            \begin{figure}
                 \includegraphics[width=\textwidth]{picture/2/predicted_met_distribution_test.png}
                 \caption{测试集预测 MET 值分布}
            \end{figure}
        \end{column}
        \begin{column}{0.5\textwidth}
            \textbf{活动分类对比}
            \begin{figure}
                 \includegraphics[width=\textwidth]{picture/2/met_category_comparison.png}
                 \caption{训练(真实) vs 测试(预测) 活动类别分布}
            \end{figure}
        \end{column}
    \end{columns}
    \medskip
    \textbf{汇总输出}: \texttt{result\_2\_summary.xlsx} (包含各强度活动时长统计)。 % 可放表格截图
\end{frame}

% ==============================
% 5. 任务三：睡眠阶段智能识别
% ==============================
\section{任务三：睡眠阶段智能识别}

\begin{frame}{目标、挑战与方法}
    \frametitle{任务三：基于 HMM 的无监督睡眠模式识别}
    \textbf{目标}: 识别并分析个体的睡眠模式。
    \medskip
    \textbf{挑战}: \alert{缺乏精确的睡眠阶段标签}。
    \medskip
    \textbf{方法}:
    \begin{enumerate}
        \item \textbf{筛选睡眠时段}: 利用任务二预测 \alert{MET < 1.0} 的窗口。
        \item \textbf{特征提取}: 睡眠窗口内加速度幅值的 \alert{均值} 与 \alert{标准差}。
        \item \textbf{HMM 建模}: 为每个个体训练独立的高斯 HMM (\alert{3 个隐藏状态}/模式)。
        \item \textbf{模式预测}: 使用 Viterbi 算法预测每个窗口的模式。
    \end{enumerate}
\end{frame}

% --- 新增：任务三核心代码示例 ---
\begin{frame}[fragile]
    \frametitle{任务三：核心代码逻辑}
    \textbf{筛选睡眠窗口及特征提取 (process\_subject\_sleep\_data 函数部分)}
    \begin{lstlisting}[caption={识别睡眠窗口并提取特征}]
# 1. 加载 MET 预测结果...
met_preds_df = pd.read_csv(met_pred_file)
# 2. 识别睡眠窗口 (基于 MET 预测)
sleep_windows_met = met_preds_df[met_preds_df['predicted_met'] < MET_SLEEP_THRESHOLD]
# 3. 加载原始加速度数据...
accel_df = pd.read_csv(accel_data_file)
accel_df = parse_time(accel_df)
accel_df = calculate_magnitude(accel_df)
# 4. 为每个睡眠窗口提取特征
sleep_features_list = []
valid_sleep_timestamps = []
for sleep_window_start in sleep_windows_met['timestamp']:
    window_end = sleep_window_start + timedelta(seconds=WINDOW_SIZE_SEC)
    window_accel_data = accel_df[...] # 筛选对应时间窗口数据
    features = extract_sleep_window_features(window_accel_data) # 提取 mag_mean, mag_std
    if features is not None:
        sleep_features_list.append(features)
        valid_sleep_timestamps.append(sleep_window_start)
    \end{lstlisting}
    \vspace{0.5em}
    \textbf{HMM 建模与预测 (process\_subject\_sleep\_data 函数部分)}
    \begin{lstlisting}[caption={标准化、HMM训练与预测}]
# 5. 特征标准化
scaler = StandardScaler()
scaled_features = scaler.fit_transform(np.array(sleep_features_list))
# 6. 训练 HMM 并预测睡眠模式
hmm_model = hmm.GaussianHMM(n_components=N_SLEEP_MODES, covariance_type="diag",
                            n_iter=N_HMM_ITERATIONS, random_state=RANDOM_STATE)
hmm_model.fit(scaled_features)
predicted_modes = hmm_model.predict(scaled_features) # 预测模式
# 7. 计算总睡眠时长和各模式时长...
    \end{lstlisting}
\end{frame}

\begin{frame}{睡眠模式分析结果}
    \begin{columns}[T]
        \begin{column}{0.6\textwidth}
            \textbf{模式解释与可视化}
            \begin{figure}
                 \includegraphics[width=\textwidth]{picture/3/feature_distribution_by_mode.png}
                 \caption{不同模式下的特征分布}
            \end{figure}
            *模式 0 活动水平最低最稳定，模式 2 活动水平相对较高。
            \begin{figure}
                 \includegraphics[width=0.8\textwidth]{picture/3/hypnogram_T110.png} % 使用 T110 作为示例
                 \caption{代表性受试者睡眠模式图 (Hypnogram) - T110}
            \end{figure}
            % 可选：添加转换矩阵
            % \begin{figure}
            %      \includegraphics[width=0.7\textwidth]{picture/3/transition_matrix_T110.png}
            %      \caption{模式转换矩阵 (T110)}
            % \end{figure}
             % 可选：添加特征散点图
            % \begin{figure}
            %      \includegraphics[width=\textwidth]{picture/3/feature_scatter_by_mode.png}
            %      \caption{特征散点图 (按模式着色)}
            % \end{figure}
        \end{column}
        \begin{column}{0.4\textwidth}
            \textbf{总体统计}
            \begin{figure}
                 \includegraphics[width=\textwidth]{picture/3/overall_sleep_mode_proportions.png} % 假设这个是饼图或比例图
                 \caption{平均睡眠模式时长占比}
            \end{figure}
            \medskip
            \textbf{汇总表}: \texttt{result\_3\_summary.xlsx}
            % 示例表格
            \tiny
            \begin{tabular}{lrrrr}
                \toprule
                志愿者ID & 总睡眠(h) & 模式1(m) & 模式2(m) & 模式3(m) \\
                \midrule
                P201 & 8.3824 & 200.1 & 150.5 & 152.3 \\ % 示例数据
                P202 & 10.2725 & 300.2 & 180.1 & 136.1 \\
                ... & ... & ... & ... & ... \\
                \bottomrule
            \end{tabular}
            \normalsize
            \medskip
            \begin{figure}
                \includegraphics[width=\textwidth]{picture/3/total_sleep_duration_histogram.png}
                \caption{总睡眠时长分布}
            \end{figure}
        \end{column}
    \end{columns}
\end{frame}

% ==============================
% 6. 任务四：久坐行为健康预警
% ==============================
\section{任务四：久坐行为健康预警}

\begin{frame}{目标与方法}
    \frametitle{任务四：基于 MET 预测的久坐行为识别}
    \begin{columns}[T]
        \begin{column}{0.5\textwidth}
            \textbf{目标}: 识别连续静态 (\alert{1.0 ≤ MET < 1.6}) \alert{超过 30 分钟} 的行为。
            \medskip
            \textbf{方法}:
            \begin{enumerate}
                \item 加载 MET 预测 (任务二结果)。
                \item 筛选静态窗口 (\texttt{1.0 <= met < 1.6})。
                \item 识别连续片段 (时间差 + \alert{\texttt{cumsum}} 分组)。
                \item 时长计算与筛选 (>= 30 分钟)。
                \item 并行处理加速。
            \end{enumerate}
        \end{column}
        \begin{column}{0.5\textwidth}
            \textbf{流程图}:
            \begin{figure}
                 % TODO: 建议将 Mermaid 流程图导出为图片替换下方占位符
                 \fbox{\includegraphics[width=\textwidth]{picture/placeholder_task4_flow.png}}
                 \caption{任务四处理流程 (请替换为实际流程图)}
            \end{figure}
            % --- Mermaid Code (for reference, from task4_sedentary_detection.md) ---
            % flowchart TD
            %     A([开始]) --> B["加载配置参数"]
            %     B --> C["创建输出目录"]
            %     C --> D["加载测试集元数据"]
            %     D --> E["获取受试者PID列表"]
            %     E --> F["准备并行任务"]
            %     F --> G["并行多进程处理"]
            %     subgraph process["单个受试者处理流程"]
            %         H["读取MET预测文件"] --> I["筛选MET值1.0到1.6范围"]
            %         I --> J["计算时间差识别连续片段"]
            %         J --> K["分组计算片段时长"]
            %         K --> L["筛选大于30分钟片段"]
            %         L --> M["返回久坐事件列表"]
            %     end
            %     G -.-> process
            %     M --> N["合并所有结果"]
            %     N --> O["构建总结果表"]
            %     O --> P{检测到久坐?}
            %     P -- 是 --> Q[计算每人汇总统计]
            %     P -- 否 --> R[创建全零值汇总表]
            %     Q --> S[合并全部受试者数据]
            %     R --> S
            %     subgraph visual["数据可视化"]
            %     end
            %     S --> visual
            %     visual --> U["准备最终输出表"]
            %     U --> V["保存Excel结果"]
            %     V --> W([结束])
        \end{column}
    \end{columns}
\end{frame}

% --- 新增：任务四核心代码示例 ---
\begin{frame}[fragile]
    \frametitle{任务四：核心代码逻辑}
    \textbf{识别连续静态片段 (process\_subject\_sedentary\_data 函数部分)}
    \begin{lstlisting}[caption={使用 cumsum 识别连续片段}]
# 2. 筛选静态且非睡眠窗口 (1.0 <= MET < 1.6)
static_non_sleep_windows = met_preds_df[...]

if static_non_sleep_windows.empty: return []

# 3. 识别连续的静态非睡眠窗口
static_non_sleep_windows['time_diff'] = static_non_sleep_windows['timestamp'].diff().dt.total_seconds()
# 判断新片段开始 (首行或时间差大于步长+容忍度)
static_non_sleep_windows['new_segment'] = (static_non_sleep_windows['time_diff'].isna()) | \
    (static_non_sleep_windows['time_diff'] > STEP_SEC + 0.5 * STEP_SEC)
# 使用 cumsum() 对 new_segment (布尔值) 求累计和，得到唯一的 segment_id
static_non_sleep_windows['segment_id'] = static_non_sleep_windows['new_segment'].cumsum()
    \end{lstlisting}
    \vspace{0.5em}
    \textbf{计算时长并筛选久坐 (process\_subject\_sedentary\_data 函数部分)}
    \begin{lstlisting}[caption={分组计算时长并筛选}]
# 4. 计算每个连续静态非睡眠片段的时长并筛选久坐行为
segment_groups = static_non_sleep_windows.groupby('segment_id')
detected_bouts = []
for segment_id, group in segment_groups:
    if len(group) < 2: continue # 单个窗口不可能构成久坐

    start_time = group['timestamp'].iloc[0]
    # 结束时间是最后一个窗口的开始时间 + 窗口大小
    end_time = group['timestamp'].iloc[-1] + timedelta(seconds=WINDOW_SIZE_SEC)
    duration_seconds = (end_time - start_time).total_seconds()

    # 检查是否超过久坐阈值
    if duration_seconds >= SEDENTARY_DURATION_SECONDS: # 30分钟
        detected_bouts.append({
            '志愿者ID': subject_tid_str,
            '久坐开始时间': start_time,
            '久坐结束时间': end_time,
            '久坐持续时长（分钟）': duration_seconds / 60.0
        })
return detected_bouts
    \end{lstlisting}
\end{frame}

\begin{frame}{久坐行为分析结果}
    \begin{columns}[T]
        \begin{column}{0.5\textwidth}
            \textbf{汇总统计 (\texttt{result\_4\_summary.xlsx})}
            % 示例表格
            \tiny
            \begin{tabular}{lrrr}
                \toprule
                志愿者ID & 总久坐(m) & 次数 & 久坐提醒 \\
                \midrule
                T001 & 125.5000 & 3 & Sedentary \\
                T002 & 0.0000 & 0 & Normal \\
                T003 & 88.7500 & 2 & Sedentary \\
                ... & ... & ... & ... \\
                \bottomrule
            \end{tabular}
            \normalsize
            \bigskip
            \textbf{可视化分析 (示例)}
            \begin{figure}
                 \includegraphics[width=\textwidth]{picture/4/sedentary_summary_histograms.png}
                 \caption{总久坐时长与次数分布}
            \end{figure}
            % 可选：添加箱线图
            % \begin{figure}
            %     \includegraphics[width=0.8\textwidth]{picture/4/total_sedentary_duration_boxplot.png}
            %     \caption{总时长箱线图}
            % \end{figure}
        \end{column}
        \begin{column}{0.5\textwidth}
            \textbf{可视化分析 (续)}
            \begin{figure}
                 \includegraphics[width=\textwidth]{picture/4/sedentary_bout_duration_histogram.png}
                 \caption{单次久坐时长分布}
            \end{figure}
             \begin{figure}
                 \includegraphics[width=\textwidth]{picture/4/sedentary_start_hour_distribution.png}
                 \caption{久坐开始小时分布}
            \end{figure}
            % 可选：添加散点图
            % \begin{figure}
            %     \includegraphics[width=0.9\textwidth]{picture/4/sedentary_duration_vs_count_scatter.png}
            %     \caption{时长 vs 次数}
            % \end{figure}
        \end{column}
    \end{columns}
\end{frame}

% ==============================
% 7. 总结与展望
% ==============================
\section{总结与展望}

\begin{frame}{总结与展望}
    \textbf{成果总结}:
    \begin{itemize}
        \item 成功完成赛题要求的四大任务。
        \item 构建了 MET 预测模型、睡眠模式识别算法和久坐检测规则。
        \item 提交了符合格式要求的 \texttt{result\_*.xlsx} 文件和分析图表。
    \end{itemize}
    \pause
    \textbf{技术亮点}:
    \begin{itemize}
        \item 高效并行处理框架应对大数据挑战。
        \item LightGBM 实现准确高效的 MET 预测。
        \item HMM 在无监督场景下探索睡眠模式。
        \item 丰富的可视化辅助结果分析与解读。
    \end{itemize}
    \pause
    \textbf{未来展望}:
    \begin{itemize}
        \item 模型优化：尝试更先进的时序模型，模型融合。
        \item 特征工程：引入更多生理或环境特征。
        \item 应用拓展：开发实时健康预警系统，个性化干预建议。
    \end{itemize}
\end{frame}

% ==============================
% 8. 致谢/Q&A
% ==============================
\section{致谢与 Q\&A}

\begin{frame}{致谢}
    \centering % 居中
    \Large % 稍大字号
    感谢评委老师！\\\\[1em] % 换行并增加间距
    感谢 [指导老师姓名] 的悉心指导！\\\\[1em] % TODO: 修改
    感谢 [团队成员姓名] 的共同努力！\\\\[1em] % TODO: 修改
    感谢泰迪杯组委会提供平台！
    \vfill % 填充空白
    \huge Q \& A
\end{frame}

\end{document} 